package chapter4.homework;

/**
 * @Project ：learn_java
 * @File ：Q5.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/9 20:35
 * @Description ：
案例需求：
要求两个线程，同时打印字母，每个线程都能连续打印3个字母。两个线程交替打印，一个线程打印字母的小写形式，一个线程打印字母的大写形式，但是字母是连续的。当字母循环到z之后，回到a。

开发提示：
（1）声明一个资源类，例如：PrintLetter
	包含一个char类型的成员变量letter，初始化为'a'，
	包含void printLower() 负责打印小写字母，使用循环连续打印3个字母，如果letter的值已经是'z'里，重新赋值为'a'。唤醒其他线程，当前线程等待。
	包含printUpper()负责打印大写字母，使用循环连续打印3个字母，并把letter中的字母转换为大写形式输出。唤醒其他线程，当前线程等待。
（2）在测试类中
	创建资源类PrintLetter对象
	创建并启动一个线程，负责调用资源类PrintLetter对象的printLower()
	创建并启动另一个线程，负责调用资源类PrintLetter对象的printUpper()
 */

public class Q5 {
    public static void main(String[] args) {
        PrintLetter p = new PrintLetter();

        Thread t1 = new Thread(
                () -> {
                    while (true) {
                        p.printLower();
                    }
                }
        );

        Thread t2 = new Thread(
                () -> {
                    while (true) {
                        p.printUpper();
                    }
                }
        );

        t1.setName("小写线程");
        t2.setName("大写线程");

        t1.start();
        t2.start();
    }
}

class PrintLetter {
    private char letter = 'a';
    private final Object lock = new Object();

    public void printLower() {
        synchronized (lock) {
            for (int i = 1; i <= 3; i++) {
                System.out.println(Thread.currentThread().getName() + "->" + letter);
                letter = letter == 'z' ? 'a' : (char) (letter + 1);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            lock.notify();
            try {
                lock.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public void printUpper() {
        synchronized (lock) {
            for (int i = 1; i <= 3; i++) {
                System.out.println(Thread.currentThread().getName() + "->" + Character.toUpperCase(letter));
                letter = letter == 'z' ? 'a' : (char) (letter + 1);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            lock.notify();
            try {
                lock.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
